Amazon DynamoDB এ Query এবং Scan অপারেশন দুটি প্রধান উপায় ডেটা রিড করার জন্য। তবে, এই দুটি অপারেশন একে অপর থেকে আলাদা এবং তাদের ব্যবহারের জন্য বিভিন্ন পরিস্থিতি রয়েছে। এখানে Query এবং Scan এর মধ্যে পার্থক্য এবং প্রতিটির ব্যবহারিক গুরুত্ব বিস্তারিতভাবে তুলে ধরা হলো।
Query অপারেশন ডেটা ফিল্টার এবং রিটার্ন করার জন্য সবচেয়ে কার্যকরী উপায়, বিশেষ করে যখন আপনি ডেটাকে একটি নির্দিষ্ট Partition Key এর ভিত্তিতে অনুসন্ধান করেন। Query অপারেশনটি Sort Key এর সাথে কাজ করতে পারে এবং ডেটার একটি নির্দিষ্ট সাবসেট রিটার্ন করতে সাহায্য করে।
import boto3
# DynamoDB ক্লায়েন্ট তৈরি করা
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('Users')
# Partition Key (UserID) এর মাধ্যমে ডেটা অনুসন্ধান
response = table.query(
KeyConditionExpression=boto3.dynamodb.conditions.Key('UserID').eq('12345')
)
for item in response['Items']:
print(item)
Scan অপারেশন ডেটাবেসের সমস্ত টেবিলের মধ্যে পুরো ডেটা স্ক্যান করে এবং সমস্ত আইটেম রিটার্ন করে। এটি Query এর চেয়ে কম কার্যকরী, কারণ এতে পুরো টেবিল স্ক্যান করতে হয় এবং ডেটা ফিল্টার করার জন্য Filter Expressions ব্যবহার করা হয়।
import boto3
# DynamoDB ক্লায়েন্ট তৈরি করা
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('Users')
# Scan অপারেশন
response = table.scan(
FilterExpression=boto3.dynamodb.conditions.Attr('Age').gt(30)
)
for item in response['Items']:
print(item)
বৈশিষ্ট্য | Query | Scan |
---|---|---|
কাজের ধরন | নির্দিষ্ট Partition Key এর উপর ভিত্তি করে | পুরো টেবিল স্ক্যান করা |
ডেটা রিটার্ন | একক Partition বা Sort Key অনুসারে ফিল্টারড | সম্পূর্ণ টেবিলের আইটেম রিটার্ন |
পারফরম্যান্স | দ্রুত এবং কার্যকরী | স্লো এবং বড় ডেটাসেটে বেশি ব্যয়বহুল |
ফিল্টারিং | Filter Expressions মাধ্যমে ফিল্টার করা যায় | Filter Expressions মাধ্যমে ফিল্টার করা যায় |
উপযুক্ত ব্যবহার | নির্দিষ্ট Partition Key এর ভিত্তিতে ডেটা অনুসন্ধান | ছোট টেবিল বা যেখানে Partition Key নির্দিষ্ট নয় |
DynamoDB তে Query একটি পদ্ধতি যার মাধ্যমে আপনি টেবিলের মধ্যে নির্দিষ্ট আইটেম (Items) দ্রুত খুঁজে পেতে পারেন, বিশেষত যখন আপনি এক বা একাধিক অটোমেটিকলি সাজানো (sorted) প্রাথমিক কী ব্যবহার করেন। এটি এক ধরনের প্রক্রিয়া যা নির্দিষ্ট শর্তে ডেটা পুনরুদ্ধার করতে ব্যবহৃত হয়।
import boto3
# DynamoDB client তৈরি
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('YourTableName')
# Query করা
response = table.query(
KeyConditionExpression=boto3.dynamodb.conditions.Key('PartitionKey').eq('some_value')
)
# Query ফলাফল প্রিন্ট করা
for item in response['Items']:
print(item)
Key('PartitionKey').eq('some_value')
: এই শর্তটি নিশ্চিত করে যে শুধুমাত্র ঐ partition key এর রেকর্ডগুলো ফেরত আসবে, যার মান 'some_value'
।DynamoDB তে Filter Expressions ব্যবহার করে আপনি Query অথবা Scan অপারেশনে ডেটা ফিল্টার করতে পারেন। এই ফিচারটি আপনাকে নির্দিষ্ট শর্তে (conditions) মেলে এমন ডেটা ফেরত আনতে সহায়তা করে। Filter Expressions সাধারণত Query বা Scan অপারেশনের পরে প্রয়োগ করা হয়, এবং এটি শুধুমাত্র রিটার্ন করা ডেটা সীমাবদ্ধ করে, তবে এটি পারফরম্যান্সকে ততটা প্রভাবিত করে না।
Filter Expression হল একটি শর্ত যা Query অথবা Scan অপারেশন চলাকালীন ডেটার মধ্যে filter প্রয়োগ করে। Filter Expression ব্যবহৃত হলে, DynamoDB প্রথমে নির্দিষ্ট প্যারামিটার অনুযায়ী ডেটা অনুসন্ধান করে (Query বা Scan অপারেশন), তারপর যেসব আইটেম শর্ত পূর্ণ করে না, সেগুলো বাদ দিয়ে রিটার্ন করে।
Query অপারেশন দিয়ে আপনি একটি টেবিলের ডেটা অনুসন্ধান করেন এবং Filter Expression ব্যবহার করে আপনি নির্দিষ্ট কন্ডিশন অনুসারে ডেটা ফিল্টার করতে পারেন।
উদাহরণ: ধরুন, আপনার একটি টেবিল আছে যেখানে ProductID, ProductCategory, এবং Price আছে। আপনি এমন সমস্ত প্রোডাক্টের তথ্য চান যাদের ক্যাটেগরি "Electronics" এবং Price 50 এর বেশি।
Query Expression with Filter Expression:
const params = {
TableName : "Products",
KeyConditionExpression: "ProductCategory = :category",
FilterExpression: "Price > :price",
ExpressionAttributeValues: {
":category": "Electronics",
":price": 50
}
};
docClient.query(params, function(err, data) {
if (err) {
console.log("Error", err);
} else {
console.log("Success", data.Items);
}
});
এখানে:
KeyConditionExpression
দ্বারা ProductCategory এর জন্য Query নির্ধারণ করা হয়েছে।FilterExpression
দ্বারা Price এর জন্য শর্ত দেয়া হয়েছে (Price > 50)।Scan অপারেশন DynamoDB টেবিলের সমস্ত আইটেম স্ক্যান করে, এবং আপনি Filter Expressions ব্যবহার করে ফলাফলগুলো ফিল্টার করতে পারেন। তবে, Scan অপারেশনটি কম পারফর্ম্যান্স হতে পারে, কারণ এটি পুরো টেবিল স্ক্যান করে।
উদাহরণ: ধরুন, আপনার একটি টেবিল "Employees" আছে, এবং আপনি সব কর্মচারীকে দেখতে চান যাদের বয়স 30 এর বেশি এবং পদ "Manager"।
Scan Expression with Filter Expression:
const params = {
TableName : "Employees",
FilterExpression: "Age > :age and Position = :position",
ExpressionAttributeValues: {
":age": 30,
":position": "Manager"
}
};
docClient.scan(params, function(err, data) {
if (err) {
console.log("Error", err);
} else {
console.log("Success", data.Items);
}
});
এখানে:
FilterExpression
দ্বারা Age এর জন্য শর্ত দেয়া হয়েছে (Age > 30) এবং Position এর জন্য শর্ত দেয়া হয়েছে (Position = "Manager")।=
, <
, >
, <=
, >=
, <>
(Not equal)Age > :age
AND
, OR
Age > :age AND Position = :position
begins_with(attribute, value)
: যদি আপনি স্ট্রিংয়ের শুরুতে নির্দিষ্ট শব্দ দেখতে চান।contains(attribute, value)
: যদি আপনি স্ট্রিংয়ের মধ্যে একটি নির্দিষ্ট শব্দ দেখতে চান।begins_with(Username, "admin")
attribute_exists(attribute)
: যদি একটি অ্যাট্রিবিউট বিদ্যমান থাকে।attribute_not_exists(attribute)
: যদি একটি অ্যাট্রিবিউট অনুপস্থিত থাকে।Filter Expressions DynamoDB তে ডেটার রিটার্ন নিয়ে আরও ফাইন টিউনিং করার জন্য ব্যবহৃত হয়। এটি আপনাকে আরও নির্দিষ্টভাবে ডেটা পেতে সাহায্য করে, তবে এটি পুরো স্ক্যান বা কুয়েরি ফলাফলকে প্রভাবিত করে, এবং বড় টেবিলের ক্ষেত্রে পারফরম্যান্সের ওপর প্রভাব ফেলতে পারে।
Amazon DynamoDB তে Query এবং Scan দুটি প্রধান ডেটা রিট্রিভাল অপারেশন। যদিও উভয়ই ডেটা খোঁজার জন্য ব্যবহৃত হয়, কিন্তু তাদের কার্যপ্রণালী এবং পারফরম্যান্সে কিছু গুরুত্বপূর্ণ পার্থক্য রয়েছে।
এখানে Query এবং Scan এর মধ্যে পার্থক্যগুলি বিস্তারিতভাবে ব্যাখ্যা করা হয়েছে:
Query অপারেশনটি খুবই দক্ষ এবং এটি প্রাইমারি কিকে (Primary Key) ভিত্তিতে ডেটা খোঁজে। এটি একটি টেবিলের নির্দিষ্ট আইটেমগুলো বের করার জন্য ব্যবহৃত হয়, যেখানে আপনি Partition Key (এবং প্রযোজ্য হলে Sort Key) ব্যবহার করেন। Query অপারেশনটি দ্রুত এবং পারফরম্যান্স-অপটিমাইজড, কারণ এটি শুধু প্রয়োজনীয় ডেটা সার্চ করে।
response = table.query(
KeyConditionExpression=Key('UserID').eq('12345')
)
items = response.get('Items', [])
print(items)
এই কোডটি UserID = '12345'
এর সাথে মেলে এমন সব আইটেম খুঁজে বের করবে।
Scan অপারেশনটি টেবিলের সমস্ত ডেটাকে একসাথে স্ক্যান করে এবং ফলস্বরূপ যতটুকু ডেটা মেলে, তা ফিরিয়ে দেয়। এটি Partition Key বা Sort Key এর সাথে সম্পর্কিত নয় এবং সাধারণত অনেক ধীর গতিতে কাজ করে, কারণ এটি পুরো টেবিল স্ক্যান করে। Scan অপারেশনটি পারফরম্যান্সের জন্য কম উপযুক্ত এবং সাধারণত ছোট টেবিল বা খুব প্রয়োজনীয় কেসে ব্যবহার করা উচিত।
response = table.scan(
FilterExpression=Attr('Age').gte(30)
)
items = response.get('Items', [])
print(items)
এই কোডটি সমস্ত টেবিল স্ক্যান করবে এবং যেখানে Age >= 30
, সেইসব আইটেম ফিরিয়ে দিবে।
ফিচার | Query | Scan |
---|---|---|
পারফরম্যান্স | উচ্চ পারফরম্যান্স (দ্রুত) - শুধু প্রয়োজনীয় ডেটার জন্য সার্চ করে | নিম্ন পারফরম্যান্স - পুরো টেবিল স্ক্যান করে |
ডেটা রিটারিভাল | শুধুমাত্র Partition Key এবং Sort Key এর ভিত্তিতে ডেটা রিটারিভাল | পুরো টেবিল থেকে সমস্ত ডেটা স্ক্যান করে |
কন্ডিশন | কেবল Partition Key এবং Sort Key (যদি থাকে) ব্যবহার করতে হবে | Filter Expressions ব্যবহার করা সম্ভব |
রেজাল্ট সীমা | দ্রুত ফলাফল এবং পেজিনেশন সাপোর্ট | স্লো এবং বড় ডেটাসেট নিয়ে কাজ করলে কম কার্যকর |
ব্যবহার ক্ষেত্র | নির্দিষ্ট Partition Key এর অধীনে ডেটা খোঁজার জন্য উপযুক্ত | টেবিলের সমস্ত ডেটা যাচাই করতে ব্যবহৃত |
Query হল সবচেয়ে দক্ষ এবং দ্রুত ডেটা খোঁজার পদ্ধতি যদি আপনি নিশ্চিতভাবে জানেন কোন Partition Key বা Sort Key এর উপর ভিত্তি করে ডেটা খুঁজছেন। অন্যদিকে, Scan সাধারণত তখনই ব্যবহার করা উচিত যখন আপনার টেবিলের মধ্যে মেলানো ডেটার কোনো নির্দিষ্ট গঠন নেই এবং পুরো টেবিলের সব ডেটা একসাথে স্ক্যান করতে হবে।
DynamoDB তে pagination এবং result limit সেট করা একটি গুরুত্বপূর্ণ বৈশিষ্ট্য, বিশেষত যখন আপনার টেবিলটি খুব বড় হয় এবং ডেটার পরিমাণ বেশি থাকে। DynamoDB তে Query এবং Scan অপারেশনে pagination ব্যবহার করে আপনি একাধিক পৃষ্ঠার ফলাফল পেতে পারেন, এবং result limit ব্যবহার করে আপনি কতগুলি রেকর্ড ফেরত পাবেন তা সীমাবদ্ধ করতে পারেন।
Pagination ব্যবহার করার মাধ্যমে আপনি একটি বড় ডেটাসেটের ফলাফলকে ছোট ছোট অংশে ভাগ করতে পারেন। এটি LastEvaluatedKey
ব্যবহার করে করা হয়।
Query অপারেশনটি যখন অনেক রেকর্ড ফেরত দেয়, তখন পেজিনেশন ব্যবহারের মাধ্যমে আপনি একাধিক পৃষ্ঠার ফলাফল পাবেন। DynamoDB স্বয়ংক্রিয়ভাবে শুধুমাত্র একটি নির্দিষ্ট পরিমাণের রেকর্ড ফিরিয়ে দেয় (যেটি Limit
দ্বারা নির্ধারিত), এবং পরবর্তী পেজ পাওয়ার জন্য LastEvaluatedKey ব্যবহার করা হয়।
import boto3
# DynamoDB ক্লায়েন্ট তৈরি
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('YourTableName')
# প্রথম পেজে Query অপারেশন
response = table.query(
KeyConditionExpression=Key('PrimaryKey').eq('value1'),
Limit=10 # প্রতি পৃষ্ঠায় ১০টি রেকর্ড ফিরিয়ে দিবে
)
# প্রথম পেজের রেকর্ড প্রিন্ট করা
for item in response['Items']:
print(item)
# পরবর্তী পেজ পেতে LastEvaluatedKey ব্যবহার করা
while 'LastEvaluatedKey' in response:
response = table.query(
KeyConditionExpression=Key('PrimaryKey').eq('value1'),
Limit=10,
ExclusiveStartKey=response['LastEvaluatedKey']
)
# পরবর্তী পৃষ্ঠার রেকর্ড প্রিন্ট করা
for item in response['Items']:
print(item)
Limit
: প্রতি পৃষ্ঠায় কতটি রেকর্ড ফেরত দিবে তা নির্ধারণ করে।ExclusiveStartKey
: পরবর্তী পেজের জন্য LastEvaluatedKey ব্যবহার করতে হবে।Scan অপারেশনেও pagination ব্যবহার করা হয়, তবে এটি Query এর তুলনায় কম পারফরম্যান্স সহ, কারণ Scan পুরো টেবিল স্ক্যান করে।
import boto3
# DynamoDB ক্লায়েন্ট তৈরি
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('YourTableName')
# প্রথম পেজে Scan অপারেশন
response = table.scan(
Limit=10 # প্রতি পৃষ্ঠায় ১০টি রেকর্ড ফিরিয়ে দিবে
)
# প্রথম পেজের রেকর্ড প্রিন্ট করা
for item in response['Items']:
print(item)
# পরবর্তী পেজ পেতে LastEvaluatedKey ব্যবহার করা
while 'LastEvaluatedKey' in response:
response = table.scan(
Limit=10,
ExclusiveStartKey=response['LastEvaluatedKey']
)
# পরবর্তী পৃষ্ঠার রেকর্ড প্রিন্ট করা
for item in response['Items']:
print(item)
Limit
: স্ক্যান অপারেশনের জন্য প্রতি পৃষ্ঠায় কতটি রেকর্ড ফেরত দিবে তা নির্ধারণ করা হয়।ExclusiveStartKey
: পরবর্তী পৃষ্ঠার জন্য LastEvaluatedKey ব্যবহার করতে হবে।Result Limit এর মাধ্যমে আপনি Query বা Scan অপারেশনে ফেরত আসা ডেটার সংখ্যা সীমিত করতে পারেন। এটি Limit
প্যারামিটার দিয়ে নির্ধারণ করা হয়।
যখন আপনার টেবিল বড় হয়ে যায় এবং আপনি একাধিক আইটেম এক সাথে রিটার্ন করতে চান না, তখন Limit প্যারামিটার ব্যবহার করে আপনি একটি নির্দিষ্ট পরিমাণ আইটেম রিটার্ন করতে পারেন।
import boto3
from boto3.dynamodb.conditions import Key
# DynamoDB ক্লায়েন্ট তৈরি
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('YourTableName')
# Query অপারেশনে Result Limit সেট করা
response = table.query(
KeyConditionExpression=Key('PrimaryKey').eq('value1'),
Limit=5 # প্রতি পৃষ্ঠায় ৫টি রেকর্ড রিটার্ন করবে
)
# রেকর্ড প্রিন্ট করা
for item in response['Items']:
print(item)
এই দুটি ফিচার ব্যবহার করে আপনি DynamoDB তে ডেটা পড়ার কার্যকারিতা আরও উন্নত করতে পারবেন এবং বড় ডেটাসেটগুলো সহজে ম্যানেজ করতে পারবেন।
common.read_more